package appModels

import (
	"appService/src/authValid/userAuthType"
	"appService/src/libs/crypot"
	"errors"
	"github.com/gogf/gf/frame/g"
	"github.com/gogf/gf/util/gvalid"
	"xorm.io/builder"
	"xorm.io/xorm"
)

//用户账号 信息表
type Account struct {
	Models      `xorm:"extends"`
	AccountType int              `json:"account_type" xorm:"tinyint(1) notnull default(1)"` //类型 1：普通用户 2：管理员 3：超级管理员 4：系统管理员
	Account     string           `json:"account" xorm:"varchar(32) index"`                  //账号
	Mobile      string           `json:"mobile" xorm:"varchar(20)"`                         //手机
	IdCard      string           `json:"id_card" xorm:"varchar(30)"`                        //身份证号码
	Username    string           `json:"username" xorm:"varchar(30)"`                       //用户姓名
	Post        string           `json:"post" xorm:"varchar(255)"`                          //用户岗位
	Email       string           `json:"email" xorm:"varchar(128)"`                         //电子邮箱
	Money       float64          `json:"money" xorm:"decimal(11,2) notnull default(0.00)"`  //用户金额
	Points      int              `json:"points" xorm:"int(11) notnull default(0)"`          //用户积分
	Password    string           `json:"password" xorm:"varchar(128)"`                      //登录密码
	Nickname    string           `json:"nickname" xorm:"varchar(60)"`                       //昵称
	Sex         int              `json:"sex" xorm:"tinyint(1) default(0)"`                  //性别 //0:未知 1：男 2 ：女
	AvatarUrl   string           `json:"avatar_url" xorm:"varchar(512)"`                    //头像
	Province    string           `json:"province" xorm:"varchar(30)"`                       //省份
	City        string           `json:"city" xorm:"varchar(30)"`                           //城市
	WxXcxOpenid string           `json:"wx_xcx_openid" xorm:"varchar(100) index"`           //小程序openid
	WxGzhOpenid string           `json:"wx_gzh_openid" xorm:"varchar(100) index"`           //公众号openid
	WxUnionid   string           `json:"wx_unionid" xorm:"varchar(100) index"`              //微信开放平台unionid
	Explain     string           `json:"explain" xorm:"varchar(1024)"`                      //用户简介
	MTime       `xorm:"extends"` //继承创建时间更新时间等
	Desc        string           `json:"desc" xorm:"text"` //备注
}

//添加数据校验
func (this *Account) AddValid() error {
	rules := []string{
		"Id@required#ID不能为空",
		"Bid@required#BID不能为空",
		"Account@required|min-length:6#账号不能为空|账号最少:min位",
	}
	err := gvalid.CheckStruct(this, rules, nil)
	if err == nil {
		return nil
	} else {
		return errors.New(err.FirstString())
	}
}

//修改数据校验
func (this *Account) EditValid() error {
	if this.Account == "" {
		return errors.New("账号不能为空")
	}
	if this.Account != "root" && len(this.Account) < 5 {
		return errors.New("账号最少5位")
	}
	rules := []string{
		"Id@required#ID不能为空",
		"Bid@required#BID不能为空",
	}
	err := gvalid.CheckStruct(this, rules, nil)
	if err == nil {
		return nil
	} else {
		return errors.New(err.FirstString())
	}
}

//获取模型
func (this *Account) Model() interface{} {
	return new(Account)
}

//获取模型切片
func (this *Account) Slice() interface{} {
	return new([]Account)
}

//初始化数据
func (this *Account) Init(db *xorm.Session, guid string, loginUser *UserInfo) error {
	this.Id = guid
	// this.Bid = loginUser.Account.Bid
	return nil
}

//添加之前调用，判断是否可添加，设置添加条件等
func (this *Account) AddWhere(db *xorm.Session, loginUser *UserInfo) error {
	if this.Account == "root" {
		return errors.New("账号不合法")
	}
	if loginUser.Account.Account != userAuthType.SYSTEM_ADMIN_ACCOUNT {
		if this.Account == "admin" {
			return errors.New("账号不合法")
		}
		if this.AccountType >= loginUser.Account.AccountType {
			return errors.New("您没有权限添加：" + userAuthType.GetUserTypeName(this.AccountType))
		}
	}
	has, err := db.Where(builder.Eq{"account": this.Account}).Exist(new(Account))
	if err != nil {
		g.Log().Errorf("判断账号【%v】是否存在，错误：%v", this.Account, err)
		return errors.New("添加账号失败")
	}
	if has {
		return errors.New("账号已经存在")
	}
	if this.Password != "" {
		this.Password = crypot.PassWordEncryption(this.Password)
	}
	return nil
}

//删除之前调用，判断是否可删除，设置删除条件等
func (this *Account) DeleteWhere(db *xorm.Session, loginUser *UserInfo, ids ...string) error {

	list := make([]Account, 0)
	err := db.Where(builder.In("id", ids)).Find(&list)
	if err != nil {
		g.Log().Errorf("查询删除账号，错误：%v", err)
		return errors.New("删除账号失败")
	}
	for _, v := range list {
		if v.Account == "root" {
			return errors.New("您没有删除权限")
		}
		if loginUser.Account.Account != userAuthType.SYSTEM_ADMIN_ACCOUNT {
			if v.Account == "admin" {
				return errors.New("您没有删除权限")
			}
			if v.AccountType >= loginUser.Account.AccountType {
				return errors.New("账户【" + v.Account + "】是：" + userAuthType.GetUserTypeName(v.AccountType) + "，您没有权限删除")
			}
		}
	}
	for _, v := range list {
		has, err := db.Where(builder.Eq{"account_id": v.Id}).Exist(new(Users))
		if err != nil {
			g.Log().Errorf("查询账号下是由有用户，错误：%v", err)
			return errors.New("删除账号失败")
		}
		if has {
			return errors.New("【" + v.Account + "】账号下存在用户，不能删除")
		}
	}
	db.Where(builder.In("id", ids))
	return nil
}

//修改之前调用，判断是否可修改，设置修改条件
func (this *Account) EditWhere(db *xorm.Session, loginUser *UserInfo) error {
	if this.Id == "" {
		return errors.New("请选择要修改的数据")
	}
	a := new(Account)
	has, err := db.Where(builder.Eq{"id": this.Id}).Get(a)
	if err != nil {
		g.Log().Errorf("查询账号，错误：%v", err)
		return errors.New("修改账号失败")
	}
	if !has {
		return errors.New("修改的账号不存在")
	}
	if loginUser.Account.Account != userAuthType.SYSTEM_ADMIN_ACCOUNT {
		if a.Account == "root" || a.Account == "admin" {
			return errors.New("您没有修改权限")
		}
		if a.AccountType >= loginUser.Account.AccountType {
			return errors.New("账户【" + a.Account + "】是：" + userAuthType.GetUserTypeName(a.AccountType) + "，您没有权限修改")
		}
	} else {
		if a.Account == "root" && this.Account != "root" {
			return errors.New("【root】账号只能修改资料，不能修改账号")
		}
	}
	has, err = db.Where(builder.Eq{"account": this.Account}.And(builder.Neq{"id": this.Id})).Exist(new(Account))
	if err != nil {
		g.Log().Errorf("判断账号【%v】是否存在，错误：%v", this.Account, err)
		return errors.New("修改账号失败")
	}
	if has {
		return errors.New("账号已经存在")
	}
	if this.Bid != a.Bid {
		_, err := db.Where(builder.Eq{"account_id": a.Id}).Update(map[string]string{"bid": this.Bid})
		if err != nil {
			g.Log().Errorf("修改账号，更新【%v】账户下的用户信息，错误：%v", a.Account, err)
			return errors.New("修改账号失败")
		}
	}
	if this.Password != "" {
		this.Password = crypot.PassWordEncryption(this.Password)
	}
	db.Where(builder.Eq{"id": a.Id})
	return nil
}

//查询一条数据条件
func (this *Account) GetWhere(db *xorm.Session, loginUser *UserInfo, id string) error {
	if loginUser.Account.Account != userAuthType.SYSTEM_ADMIN_ACCOUNT {
		db.Where(builder.Lte{"account_type": loginUser.Account.AccountType})
	}
	return nil
}

//查询列表条件、查询分页数据条数条件
func (this *Account) ListWhere(db *xorm.Session, loginUser *UserInfo) error {
	db.Desc("created")
	if this.Bid != "" {
		db.Where(builder.Eq{"bid": this.Bid})
	}
	if loginUser.Account.Account != userAuthType.SYSTEM_ADMIN_ACCOUNT {
		db.Where(builder.Lt{"account_type": loginUser.Account.AccountType})
	}
	return nil
}

//查询分页时条件
func (this *Account) PaginateWhere(db *xorm.Session, loginUser *UserInfo) error {
	return nil
}
